package models;

import boardGenerator.GameDifficultyLevel;
import java.io.Serializable;

/**
 * Clase Jugador implementa Comparable y Serializable
 * Permite Guardar un objeto jugador y comparar 2 jugadores
 * por puntuacion dentro de una misma dificultad
 */
public class Jugador implements Comparable,Serializable{
    private String nombre;
    private int puntuacion;
    private String tiempo;
    private GameDifficultyLevel dificultad;

    /**
     * Constructor de la Clase, crea un nuevo Jugador
     * @param configuracion de la partida actual
     * @param partida sudoku actual
     */
    public Jugador(Configuration configuracion,Partida partida) {
        nombre = configuracion.getNamePlayer();
        puntuacion = partida.getPuntuacion();
        tiempo = partida.getTiempoPartida();
        dificultad = configuracion.getDifficulty(); 
    }
    
    /**
     * Obtiene el nombre del jugador
     * @return 
     */
    public String getNombre() {
            return nombre;
    }

    /**
     * Establece el nombre del jugador
     * @param newNombre 
     */
    public void setNombre(String newNombre) {
        nombre = newNombre;
    }

    /**
     * Obtiene la puntuacion del jugador
     * @return 
     */
    public int getPuntuacion() {
            return puntuacion;
    }
    
    /**
     * Establece la puntuacion del jugador
     * @param newPuntuacion 
     */
    public void setPuntuacion(int newPuntuacion) {
        puntuacion = newPuntuacion;
    }

    /**
     * Obtiene el tiempo en que realizo la partida
     * el jugador actual
     * @return 
     */
    public String getTiempo() {
            return tiempo;
    }
    
    /**
     * Establece el tiempo en que tardo
     * en completar la partida actual
     * @param newTiempo 
     */
    public void setTiempo(String newTiempo) {
        tiempo = newTiempo;
    }
    
    /**
     * Obtiene la dificultad en que realizo
     * la partida actual
     * @return 
     */
    public GameDifficultyLevel getDificultad() {
            return dificultad;
    }
    
    /**
     * Establece la dificultad en que el jugador
     * realizo la partida actual
     * @param newDificultad 
     */
    public void setDificultad(GameDifficultyLevel newDificultad) {
        dificultad = newDificultad;
    }
    
    /**
     * Compara 2 objeto jugador por su puntuacion
     * @param o  Jugador a comparar
     * @return -1,0,1 segun a>b , a==b, a<b
     */
    @Override
    public int compareTo(Object o) {
        Jugador elem2 = (Jugador) o;
        return (this.getPuntuacion()>elem2.getPuntuacion() ? -1 : (this.getPuntuacion()==elem2.getPuntuacion() ? 0 : 1));
    }
    
    /**
     * Convierte un objeto jugador en String
     * @return string nombre,puntos,tiempo
     */
    @Override
    public String toString(){
        return "Name:"+this.nombre+" Score:"+this.puntuacion+" Time:"+this.tiempo;
    }
}